package com.cskaoyan.extend.override;

/*
       发生方法覆盖的条件: 必须是在父类子类中定义一模一样的方法？

       1. 访问权限
           a. 子类方法的访问权限，不一定要和父类方法的访问权限一样
           b. 子类方法的访问权限 >= 父类方法的访问权限

       2. 方法返回值
          a. 子类方法的方法返回值和父类方法的返回值相同
          b. 子类方法的返回值可以不和父类方法的返回值相同，
             子类方法的返回值类型 是 父类方法返回值类型的子类类型

       3. 方法签名：
           子类方法需要和父类方法相同

 */
public class Demo2Condition {

    public static void main(String[] args) {

        ConditionSon conditionSon = new ConditionSon();

        conditionSon.fatherTest();
    }
}

class ConditionFather {

    /*
         在父类方法中测试，方法覆盖的效果
     */
    public void fatherTest() {
        //testReturn();

        testSignature(10);
    }

    /*
          测试发生方法覆盖的访问权限条件
     */
    protected void testAccess() {
        System.out.println("access");
    }


    /*
        测试发生方法覆盖的返回值条件
     */
    public ConditionFather testReturn() {
        System.out.println("testReturn in father");
        return null;
    }

    /*
         发生方法覆盖的方法签名条件
     */
    public void testSignature(int a) {
        System.out.println("int a");
    }
}

class ConditionSon extends ConditionFather {
    /*
      测试发生方法覆盖的访问权限条件
    */
   public void testAccess() {
        System.out.println("access");
    }

    /*
          测试发生方法覆盖的返回值条件
          可以把一个子类对象 当成一个父类对象
     */
    public ConditionSon testReturn() {
        System.out.println("testReturn in son");
        return null;
    }

    /*
     发生方法覆盖的方法签名条件
    */
    public void testSignature(int a) {
        System.out.println("double a");
    }

}
